🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / node / src / commonMain / kotlin / org / meshtastic / feature / node / metrics / DeviceMetrics.kt
Displaying Raw • Download
feature/node/src/commonMain/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt 1390a3cd4f7bc55a37433d1d868e65c01678eb31 (1390a3cd) Text, 26.68 KB
T8b949e/*
* Copyright (c) 2025-2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72package T7ee787org.meshtastic.feature.node.metrics
Tff7b72import T7ee787androidx.compose.foundation.BorderStroke
Tff7b72import T7ee787androidx.compose.foundation.clickable
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxHeight
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.width
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.itemsIndexed
Tff7b72import T7ee787androidx.compose.foundation.text.selection.SelectionContainer
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.CardDefaults
Tff7b72import T7ee787androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Surface
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.LaunchedEffect
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.text.font.FontWeight
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.VicoScrollState
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.Axis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.axis.VerticalAxis
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.CartesianChartModelProducer
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.CartesianLayerRangeProvider
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.data.lineSeries
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.layer.LineCartesianLayer
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.layer.rememberLineCartesianLayer
Tff7b72import T7ee787com.patrykandpatrick.vico.compose.cartesian.rememberVicoScrollState
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.common.util.formatString
Tff7b72import T7ee787org.meshtastic.core.common.util.nowSeconds
Tff7b72import T7ee787org.meshtastic.core.model.TelemetryType
Tff7b72import T7ee787org.meshtastic.core.model.util.formatUptime
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.air_util_definition
Tff7b72import T7ee787org.meshtastic.core.resources.air_utilization
Tff7b72import T7ee787org.meshtastic.core.resources.battery
Tff7b72import T7ee787org.meshtastic.core.resources.ch_util_definition
Tff7b72import T7ee787org.meshtastic.core.resources.channel_utilization
Tff7b72import T7ee787org.meshtastic.core.resources.device_metrics_label_value
Tff7b72import T7ee787org.meshtastic.core.resources.device_metrics_log
Tff7b72import T7ee787org.meshtastic.core.resources.device_metrics_numeric_value
Tff7b72import T7ee787org.meshtastic.core.resources.device_metrics_percent_value
Tff7b72import T7ee787org.meshtastic.core.resources.device_metrics_voltage_value
Tff7b72import T7ee787org.meshtastic.core.resources.uptime
Tff7b72import T7ee787org.meshtastic.core.resources.voltage
Tff7b72import T7ee787org.meshtastic.core.ui.component.MaterialBatteryInfo
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AppTheme
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Cyan
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Gold
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Green
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Purple
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.CommonCharts.MS_PER_SEC
Tff7b72import T7ee787org.meshtastic.proto.Telemetry
Tff7b72private Tff7b72enum Tff7b72class T56d364DeviceTb4b4b4(Tff7b72val Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4) Tb4b4b4{
Te6edf3BATTERYTb4b4b4(Te6edf3GreenTb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Tb4b4b4(Te6edf3telemetryTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3battery_level Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3VOLTAGETb4b4b4(Te6edf3GoldTb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3voltage Tff7b72?: T79c0ff0f
Tb4b4b4}Tb4b4b4,
Te6edf3CH_UTILTb4b4b4(Te6edf3PurpleTb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3channel_utilization Tff7b72?: T79c0ff0f
Tb4b4b4}Tb4b4b4,
Te6edf3AIR_UTILTb4b4b4(Te6edf3CyanTb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3air_util_tx Tff7b72?: T79c0ff0f
Tb4b4b4}Tb4b4b4, Tb4b4b4;
Tff7b72abstract Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3LEGEND_DATA Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3batteryTb4b4b4, Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3BATTERYTb4b4b4.Te6edf3colorTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4, Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3voltageTb4b4b4, Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3VOLTAGETb4b4b4.Te6edf3colorTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4, Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(
Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4,
Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3CH_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(
Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4,
Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3AIR_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72fun Td2a8ffDeviceMetricsScreenTb4b4b4(Te6edf3viewModelTb4b4b4: Te6edf3MetricsViewModelTb4b4b4, Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3timeFrame Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3timeFrameTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3availableTimeFrames Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3availableTimeFramesTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3data Tff7b72= Te6edf3stateTb4b4b4.Te6edf3deviceMetricsTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72>Tff7b72= Te6edf3timeFrameTb4b4b4.Te6edf3timeThresholdTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3hasBattery Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3dataTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3battery_level Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3hasVoltage Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3dataTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3voltage Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3hasChUtil Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3dataTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3channel_utilization Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3hasAirUtil Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3dataTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3air_util_tx Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3filteredLegendData Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3hasBatteryTb4b4b4, Te6edf3hasVoltageTb4b4b4, Te6edf3hasChUtilTb4b4b4, Te6edf3hasAirUtilTb4b4b4) Tb4b4b4{
Te6edf3LEGEND_DATATb4b4b4.Te6edf3filter Tb4b4b4{ Te6edf3d Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3nameResTb4b4b4) Tb4b4b4{
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3battery Tff7b72-Tff7b72> Te6edf3hasBattery
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3voltage Tff7b72-Tff7b72> Te6edf3hasVoltage
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilization Tff7b72-Tff7b72> Te6edf3hasChUtil
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilization Tff7b72-Tff7b72> Te6edf3hasAirUtil
Tff7b72else Tff7b72-Tff7b72> Tff7b72true
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3infoItems Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3hasChUtilTb4b4b4, Te6edf3hasAirUtilTb4b4b4) Tb4b4b4{
Te6edf3buildList Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3hasChUtilTb4b4b4) Tb4b4b4{
Te6edf3addTb4b4b4(
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3ch_util_definitionTb4b4b4,
Te6edf3DeviceTb4b4b4.Te6edf3CH_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3hasAirUtilTb4b4b4) Tb4b4b4{
Te6edf3addTb4b4b4(
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_util_definitionTb4b4b4,
Te6edf3DeviceTb4b4b4.Te6edf3AIR_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3BaseMetricScreenTb4b4b4(
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3telemetryType Tff7b72= Te6edf3TelemetryTypeTb4b4b4.Te6edf3DEVICETb4b4b4,
Te6edf3titleRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_metrics_logTb4b4b4,
Te6edf3nodeName Tff7b72= Te6edf3stateTb4b4b4.Te6edf3nodeTff7b72?.Te6edf3userTff7b72?.Te6edf3long_name Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3data Tff7b72= Te6edf3dataTb4b4b4,
Te6edf3timeProvider Tff7b72= Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3infoData Tff7b72= Te6edf3infoItemsTb4b4b4,
Te6edf3onRequestTelemetry Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3requestTelemetryTb4b4b4(Te6edf3TelemetryTypeTb4b4b4.Te6edf3DEVICETb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3controlPart Tff7b72= Tb4b4b4{
Te6edf3TimeFrameSelectorTb4b4b4(
Te6edf3selectedTimeFrame Tff7b72= Te6edf3timeFrameTb4b4b4,
Te6edf3availableTimeFrames Tff7b72= Te6edf3availableTimeFramesTb4b4b4,
Te6edf3onTimeFrameSelected Tff7b72= Te6edf3viewModelTff7b72::Te6edf3setTimeFrameTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3hasBatteryTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3batteryValues Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3dataTb4b4b4.Te6edf3mapNotNull Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3battery_levelTff7b72?.Te6edf3toFloatTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
Te6edf3MetricSummaryRowTb4b4b4(Te6edf3values Tff7b72= Te6edf3batteryValuesTb4b4b4, Te6edf3label Tff7b72= Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3chartPart Tff7b72= Tb4b4b4{ Te6edf3modifierTb4b4b4, Te6edf3selectedXTb4b4b4, Te6edf3vicoScrollStateTb4b4b4, Te6edf3onPointSelected Tff7b72-Tff7b72>
Te6edf3DeviceMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4,
Te6edf3telemetries Tff7b72= Te6edf3dataTb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3legendData Tff7b72= Te6edf3filteredLegendDataTb4b4b4,
Te6edf3vicoScrollState Tff7b72= Te6edf3vicoScrollStateTb4b4b4,
Te6edf3selectedX Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onPointSelected Tff7b72= Te6edf3onPointSelectedTb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3listPart Tff7b72= Tb4b4b4{ Te6edf3modifierTb4b4b4, Te6edf3selectedXTb4b4b4, Te6edf3lazyListStateTb4b4b4, Te6edf3onCardClick Tff7b72-Tff7b72>
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3state Tff7b72= Te6edf3lazyListStateTb4b4b4) Tb4b4b4{
Te6edf3itemsIndexedTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3telemetry Tff7b72-Tff7b72>
Te6edf3DeviceMetricsCardTb4b4b4(
Te6edf3telemetry Tff7b72= Te6edf3telemetryTb4b4b4,
Te6edf3isSelected Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onClick Tff7b72= Tb4b4b4{ Te6edf3onCardClickTb4b4b4(Te6edf3telemetryTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3toDoubleTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsChartTb4b4b4(
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3telemetriesTb4b4b4: Te6edf3ListTff7b72<Te6edf3TelemetryTff7b72>Tb4b4b4,
Te6edf3legendDataTb4b4b4: Te6edf3ListTff7b72<Te6edf3LegendDataTff7b72>Tb4b4b4,
Te6edf3vicoScrollStateTb4b4b4: Te6edf3VicoScrollStateTb4b4b4,
Te6edf3selectedXTb4b4b4: Tffa657Double?Tb4b4b4,
Te6edf3onPointSelectedTb4b4b4: Tb4b4b4(Tffa657DoubleTb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3telemetriesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72returnTf0883e@Column
Tff7b72val Te6edf3modelProducer Tff7b72= Te6edf3remember Tb4b4b4{ Te6edf3CartesianChartModelProducerTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3batteryColor Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3BATTERYTb4b4b4.Te6edf3color
Tff7b72val Te6edf3voltageColor Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3VOLTAGETb4b4b4.Te6edf3color
Tff7b72val Te6edf3chUtilColor Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3CH_UTILTb4b4b4.Te6edf3color
Tff7b72val Te6edf3airUtilColor Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3AIR_UTILTb4b4b4.Te6edf3color
Tff7b72val Te6edf3batteryLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3batteryTb4b4b4)
Tff7b72val Te6edf3voltageLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3voltageTb4b4b4)
Tff7b72val Te6edf3channelUtilizationLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4)
Tff7b72val Te6edf3airUtilizationLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4)
Tff7b72val Te6edf3percentValueTemplate Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_metrics_percent_valueTb4b4b4)
Tff7b72val Te6edf3voltageValueTemplate Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_metrics_voltage_valueTb4b4b4)
Tff7b72val Te6edf3numericValueTemplate Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_metrics_numeric_valueTb4b4b4)
Tff7b72val Te6edf3marker Tff7b72=
Te6edf3ChartStylingTb4b4b4.Te6edf3rememberMarkerTb4b4b4(
Te6edf3valueFormatter Tff7b72=
Te6edf3ChartStylingTb4b4b4.Te6edf3createColoredMarkerValueFormatter Tb4b4b4{ Te6edf3valueTb4b4b4, Te6edf3color Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3colorTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3alpha Tff7b72= T79c0ff1fTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3batteryColor Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Te6edf3percentValueTemplateTb4b4b4, Te6edf3batteryLabelTb4b4b4, Te6edf3valueTb4b4b4)
Te6edf3voltageColor Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Te6edf3voltageValueTemplateTb4b4b4, Te6edf3voltageLabelTb4b4b4, Te6edf3valueTb4b4b4)
Te6edf3chUtilColor Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Te6edf3percentValueTemplateTb4b4b4, Te6edf3channelUtilizationLabelTb4b4b4, Te6edf3valueTb4b4b4)
Te6edf3airUtilColor Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Te6edf3percentValueTemplateTb4b4b4, Te6edf3airUtilizationLabelTb4b4b4, Te6edf3valueTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Te6edf3numericValueTemplateTb4b4b4, Te6edf3valueTb4b4b4)
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3batteryData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3telemetriesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3battery_level Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3chUtilData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3telemetriesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3channel_utilization Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3airUtilData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3telemetriesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3air_util_tx Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3voltageData Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3telemetriesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3voltage Tff7b72!Tff7b72= Tff7b72null Tb4b4b4} Tb4b4b4}
Tff7b72val Te6edf3batteryStyle Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3batteryDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ChartStylingTb4b4b4.Te6edf3createBoldLineTb4b4b4(Te6edf3batteryColorTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tff7b72val Te6edf3chUtilStyle Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3chUtilDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ChartStylingTb4b4b4.Te6edf3createSubtleLineTb4b4b4(Te6edf3chUtilColorTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tff7b72val Te6edf3airUtilStyle Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3airUtilDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3ChartStylingTb4b4b4.Te6edf3createDashedLineTb4b4b4(Te6edf3airUtilColorTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tff7b72val Te6edf3leftLayerSeriesStyles Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3batteryStyleTb4b4b4, Te6edf3chUtilStyleTb4b4b4, Te6edf3airUtilStyleTb4b4b4) Tb4b4b4{ Te6edf3listOfNotNullTb4b4b4(Te6edf3batteryStyleTb4b4b4, Te6edf3chUtilStyleTb4b4b4, Te6edf3airUtilStyleTb4b4b4) Tb4b4b4}
Te6edf3LaunchedEffectTb4b4b4(Te6edf3batteryDataTb4b4b4, Te6edf3chUtilDataTb4b4b4, Te6edf3airUtilDataTb4b4b4, Te6edf3voltageDataTb4b4b4, Te6edf3leftLayerSeriesStylesTb4b4b4) Tb4b4b4{
Te6edf3modelProducerTb4b4b4.Te6edf3runTransaction Tb4b4b4{
T8b949e/* Series for Left Axis (0-100%) */
Tff7b72if Tb4b4b4(Te6edf3leftLayerSeriesStylesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineSeries Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3batteryDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3seriesTb4b4b4(
Te6edf3x Tff7b72= Te6edf3batteryDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4,
Te6edf3y Tff7b72= Te6edf3batteryDataTb4b4b4.Te6edf3map Tb4b4b4{ Tb4b4b4(Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3battery_level Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3chUtilDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3seriesTb4b4b4(
Te6edf3x Tff7b72= Te6edf3chUtilDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4,
Te6edf3y Tff7b72= Te6edf3chUtilDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3channel_utilization Tff7b72?: T79c0ff0f Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3airUtilDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3seriesTb4b4b4(
Te6edf3x Tff7b72= Te6edf3airUtilDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4,
Te6edf3y Tff7b72= Te6edf3airUtilDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3air_util_tx Tff7b72?: T79c0ff0f Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e/* Series for Right Axis (Voltage) */
Tff7b72if Tb4b4b4(Te6edf3voltageDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3lineSeries Tb4b4b4{
Te6edf3seriesTb4b4b4(
Te6edf3x Tff7b72= Te6edf3voltageDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4,
Te6edf3y Tff7b72= Te6edf3voltageDataTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3device_metricsTff7b72?.Te6edf3voltage Tff7b72?: T79c0ff0f Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72val Te6edf3leftLayer Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3leftLayerSeriesStylesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3rememberLineCartesianLayerTb4b4b4(
Te6edf3lineProvider Tff7b72= Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(Te6edf3leftLayerSeriesStylesTb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3StartTb4b4b4,
Te6edf3rangeProvider Tff7b72= Te6edf3CartesianLayerRangeProviderTb4b4b4.Te6edf3fixedTb4b4b4(Te6edf3minY Tff7b72= T79c0ff0.0Tb4b4b4, Te6edf3maxY Tff7b72= T79c0ff1T79c0ff0T79c0ff0.0Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tff7b72val Te6edf3rightLayer Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3voltageDataTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3rememberLineCartesianLayerTb4b4b4(
Te6edf3lineProvider Tff7b72=
Te6edf3LineCartesianLayerTb4b4b4.Te6edf3LineProviderTb4b4b4.Te6edf3seriesTb4b4b4(
Te6edf3ChartStylingTb4b4b4.Te6edf3createGradientLineTb4b4b4(Te6edf3lineColor Tff7b72= Te6edf3voltageColorTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3verticalAxisPosition Tff7b72= Te6edf3AxisTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3VerticalTb4b4b4.Te6edf3EndTb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Tff7b72val Te6edf3layers Tff7b72= Te6edf3rememberTb4b4b4(Te6edf3leftLayerTb4b4b4, Te6edf3rightLayerTb4b4b4) Tb4b4b4{ Te6edf3listOfNotNullTb4b4b4(Te6edf3leftLayerTb4b4b4, Te6edf3rightLayerTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3layersTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3decorations Tff7b72= Te6edf3buildList Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3leftLayer Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3addTb4b4b4(Te6edf3ChartStylingTb4b4b4.Te6edf3rememberThresholdLineTb4b4b4(Te6edf3y Tff7b72= T79c0ff2T79c0ff0.0Tb4b4b4, Te6edf3color Tff7b72= Te6edf3batteryColorTb4b4b4, Te6edf3label Tff7b72= Ta5d6ff"Ta5d6ff20%Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3GenericMetricChartTb4b4b4(
Te6edf3modelProducer Tff7b72= Te6edf3modelProducerTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3weightTb4b4b4(T79c0ff1fTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3bottom Tff7b72= T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3layers Tff7b72= Te6edf3layersTb4b4b4,
Te6edf3startAxis Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3leftLayer Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3VerticalAxisTb4b4b4.Te6edf3rememberStartTb4b4b4(
Te6edf3label Tff7b72= Te6edf3ChartStylingTb4b4b4.Te6edf3rememberAxisLabelTb4b4b4(Te6edf3color Tff7b72= Te6edf3batteryColorTb4b4b4)Tb4b4b4,
Te6edf3valueFormatter Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3valueTb4b4b4, Te6edf3_ Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Ta5d6ff"Ta5d6ff%.0f%%Ta5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3endAxis Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3rightLayer Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3VerticalAxisTb4b4b4.Te6edf3rememberEndTb4b4b4(
Te6edf3label Tff7b72= Te6edf3ChartStylingTb4b4b4.Te6edf3rememberAxisLabelTb4b4b4(Te6edf3color Tff7b72= Te6edf3voltageColorTb4b4b4)Tb4b4b4,
Te6edf3valueFormatter Tff7b72= Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3valueTb4b4b4, Te6edf3_ Tff7b72-Tff7b72> Te6edf3formatStringTb4b4b4(Ta5d6ff"Ta5d6ff%.1f VTa5d6ff"Tb4b4b4, Te6edf3valueTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}Tb4b4b4,
Te6edf3bottomAxis Tff7b72= Te6edf3CommonChartsTb4b4b4.Te6edf3rememberBottomTimeAxisTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3marker Tff7b72= Te6edf3markerTb4b4b4,
Te6edf3decorations Tff7b72= Te6edf3decorationsTb4b4b4,
Te6edf3selectedX Tff7b72= Te6edf3selectedXTb4b4b4,
Te6edf3onPointSelected Tff7b72= Te6edf3onPointSelectedTb4b4b4,
Te6edf3vicoScrollState Tff7b72= Te6edf3vicoScrollStateTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3LegendTb4b4b4(Te6edf3legendData Tff7b72= Te6edf3legendDataTb4b4b4, Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3top Tff7b72= T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUnusedPrivateMemberTa5d6ff"Tb4b4b4) T8b949e// Compose preview with fake data
Tf0883e@Composable
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsChartPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3telemetries Tff7b72=
Te6edf3ListTb4b4b4(T79c0ff2T79c0ff0Tb4b4b4) Tb4b4b4{ Te6edf3i Tff7b72-Tff7b72>
Te6edf3TelemetryTb4b4b4(
Te6edf3time Tff7b72= Te6edf3now Tff7b72- Tb4b4b4(T79c0ff1T79c0ff9 Tff7b72- Te6edf3iTb4b4b4) Tff7b72* T79c0ff6T79c0ff0 Tff7b72* T79c0ff6T79c0ff0Tb4b4b4, T8b949e// 1-hour intervals, oldest first
Te6edf3device_metrics Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3DeviceMetricsTb4b4b4(
Te6edf3battery_level Tff7b72= T79c0ff8T79c0ff0 Tff7b72- Te6edf3iTb4b4b4,
Te6edf3voltage Tff7b72= T79c0ff3.7f Tff7b72- Te6edf3i Tff7b72* T79c0ff0.02fTb4b4b4,
Te6edf3channel_utilization Tff7b72= T79c0ff1T79c0ff0f Tff7b72+ Te6edf3i Tff7b72* T79c0ff2Tb4b4b4,
Te6edf3air_util_tx Tff7b72= T79c0ff5f Tff7b72+ Te6edf3iTb4b4b4,
Te6edf3uptime_seconds Tff7b72= T79c0ff3T79c0ff6T79c0ff0T79c0ff0 Tff7b72+ Te6edf3i Tff7b72* T79c0ff3T79c0ff0T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3AppTheme Tb4b4b4{
Te6edf3DeviceMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3telemetries Tff7b72= Te6edf3telemetriesTb4b4b4,
Te6edf3legendData Tff7b72= Te6edf3LEGEND_DATATb4b4b4,
Te6edf3vicoScrollState Tff7b72= Te6edf3rememberVicoScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedX Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onPointSelected Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tf0883e@Composable
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsCardTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4, Te6edf3isSelectedTb4b4b4: Tffa657BooleanTb4b4b4, Te6edf3onClickTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3deviceMetrics Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3device_metrics
Tff7b72val Te6edf3time Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3timeTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4) Tff7b72* Te6edf3MS_PER_SEC
Tff7b72val Te6edf3channelUtilizationLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4)
Tff7b72val Te6edf3airUtilizationLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4)
Tff7b72val Te6edf3uptimeLabel Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3uptimeTb4b4b4)
Tff7b72val Te6edf3percentValueTemplate Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_metrics_percent_valueTb4b4b4)
Tff7b72val Te6edf3labelValueTemplate Tff7b72= Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3device_metrics_label_valueTb4b4b4)
Te6edf3CardTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4.Te6edf3clickable Tb4b4b4{ Te6edf3onClickTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4,
Te6edf3border Tff7b72= Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) Te6edf3BorderStrokeTb4b4b4(T79c0ff2.Te6edf3dpTb4b4b4, Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryTb4b4b4) Tff7b72else Tff7b72nullTb4b4b4,
Te6edf3colors Tff7b72=
Te6edf3CardDefaultsTb4b4b4.Te6edf3cardColorsTb4b4b4(
Te6edf3containerColor Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isSelectedTb4b4b4) Tb4b4b4{
Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3primaryContainer
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3surfaceVariant
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3SurfaceTb4b4b4(Te6edf3color Tff7b72= Te6edf3ColorTb4b4b4.Te6edf3TransparentTb4b4b4) Tb4b4b4{
Te6edf3SelectionContainer Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e/* Time, Battery, and Voltage */
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3CommonChartsTb4b4b4.Te6edf3formatDateTimeTb4b4b4(Te6edf3timeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3titleMediumEmphasizedTb4b4b4,
Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4,
Tb4b4b4)
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3deviceMetricsTff7b72?.Te6edf3battery_level Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3MetricIndicatorTb4b4b4(Te6edf3DeviceTb4b4b4.Te6edf3BATTERYTb4b4b4.Te6edf3colorTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3deviceMetricsTff7b72?.Te6edf3voltage Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3MetricIndicatorTb4b4b4(Te6edf3DeviceTb4b4b4.Te6edf3VOLTAGETb4b4b4.Te6edf3colorTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Te6edf3MaterialBatteryInfoTb4b4b4(
Te6edf3level Tff7b72= Te6edf3deviceMetricsTff7b72?.Te6edf3battery_level Tff7b72?: T79c0ff0Tb4b4b4,
Te6edf3voltage Tff7b72= Te6edf3deviceMetricsTff7b72?.Te6edf3voltage Tff7b72?: T79c0ff0fTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4)
T8b949e/* Channel Utilization and Air Utilization Tx */
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4) Tb4b4b4{
Te6edf3RowTb4b4b4(Te6edf3verticalAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3CenterVerticallyTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3deviceMetricsTff7b72?.Te6edf3channel_utilization Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3MetricIndicatorTb4b4b4(Te6edf3DeviceTb4b4b4.Te6edf3CH_UTILTb4b4b4.Te6edf3colorTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3formatStringTb4b4b4(
Te6edf3percentValueTemplateTb4b4b4,
Te6edf3channelUtilizationLabelTb4b4b4,
Te6edf3deviceMetricsTb4b4b4.Te6edf3channel_utilization Tff7b72?: T79c0ff0fTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff1T79c0ff2.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3deviceMetricsTff7b72?.Te6edf3air_util_tx Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3MetricIndicatorTb4b4b4(Te6edf3DeviceTb4b4b4.Te6edf3AIR_UTILTb4b4b4.Te6edf3colorTb4b4b4)
Te6edf3SpacerTb4b4b4(Te6edf3ModifierTb4b4b4.Te6edf3widthTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3formatStringTb4b4b4(
Te6edf3percentValueTemplateTb4b4b4,
Te6edf3airUtilizationLabelTb4b4b4,
Te6edf3deviceMetricsTb4b4b4.Te6edf3air_util_tx Tff7b72?: T79c0ff0fTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72=
Te6edf3formatStringTb4b4b4(
Te6edf3labelValueTemplateTb4b4b4,
Te6edf3uptimeLabelTb4b4b4,
Te6edf3formatUptimeTb4b4b4(Te6edf3deviceMetricsTff7b72?.Te6edf3uptime_seconds Tff7b72?: T79c0ff0Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUnusedPrivateMemberTa5d6ff"Tb4b4b4) T8b949e// Compose preview with fake data
Tf0883e@Composable
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsCardPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3telemetry Tff7b72=
Te6edf3TelemetryTb4b4b4(
Te6edf3time Tff7b72= Te6edf3nowTb4b4b4,
Te6edf3device_metrics Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3DeviceMetricsTb4b4b4(
Te6edf3battery_level Tff7b72= T79c0ff7T79c0ff5Tb4b4b4,
Te6edf3voltage Tff7b72= T79c0ff3.65fTb4b4b4,
Te6edf3channel_utilization Tff7b72= T79c0ff2T79c0ff2.5fTb4b4b4,
Te6edf3air_util_tx Tff7b72= T79c0ff1T79c0ff2.0fTb4b4b4,
Te6edf3uptime_seconds Tff7b72= T79c0ff7T79c0ff2T79c0ff0T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3AppTheme Tb4b4b4{ Te6edf3DeviceMetricsCardTb4b4b4(Te6edf3telemetry Tff7b72= Te6edf3telemetryTb4b4b4, Te6edf3isSelected Tff7b72= Tff7b72falseTb4b4b4, Te6edf3onClick Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUnusedPrivateMemberTa5d6ff"Tb4b4b4) T8b949e// Compose preview with fake data
Tf0883e@Composable
Tf0883e@OptInTb4b4b4(Te6edf3ExperimentalMaterial3ExpressiveApiTff7b72::Te6edf3classTb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsScreenPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3telemetries Tff7b72=
Te6edf3ListTb4b4b4(T79c0ff2T79c0ff4Tb4b4b4) Tb4b4b4{ Te6edf3i Tff7b72-Tff7b72>
Te6edf3TelemetryTb4b4b4(
Te6edf3time Tff7b72= Te6edf3now Tff7b72- Tb4b4b4(T79c0ff2T79c0ff3 Tff7b72- Te6edf3iTb4b4b4) Tff7b72* T79c0ff6T79c0ff0 Tff7b72* T79c0ff6T79c0ff0Tb4b4b4, T8b949e// 1-hour intervals, oldest first
Te6edf3device_metrics Tff7b72=
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3DeviceMetricsTb4b4b4(
Te6edf3battery_level Tff7b72= T79c0ff8T79c0ff5 Tff7b72- Te6edf3i Tff7b72* T79c0ff2Tb4b4b4, T8b949e// Battery decreases over time
Te6edf3voltage Tff7b72= T79c0ff3.8f Tff7b72- Te6edf3i Tff7b72* T79c0ff0.01fTb4b4b4, T8b949e// Voltage decreases slightly
Te6edf3channel_utilization Tff7b72= T79c0ff1T79c0ff5f Tff7b72+ Te6edf3i Tff7b72* T79c0ff1.5fTb4b4b4, T8b949e// Channel utilization increases
Te6edf3air_util_tx Tff7b72= T79c0ff8f Tff7b72+ Te6edf3i Tff7b72* T79c0ff0.8fTb4b4b4, T8b949e// Air utilization increases
Te6edf3uptime_seconds Tff7b72= T79c0ff3T79c0ff6T79c0ff0T79c0ff0 Tff7b72+ Te6edf3i Tff7b72* T79c0ff3T79c0ff6T79c0ff0T79c0ff0Tb4b4b4, T8b949e// Uptime increases by 1 hour each
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3AppTheme Tb4b4b4{
Te6edf3Surface Tb4b4b4{
Te6edf3Column Tb4b4b4{
Tff7b72var Te6edf3displayInfoDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3displayInfoDialogTb4b4b4) Tb4b4b4{
Te6edf3LegendInfoDialogTb4b4b4(
Te6edf3infoData Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3ch_util_definitionTb4b4b4,
Te6edf3DeviceTb4b4b4.Te6edf3CH_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3InfoDialogDataTb4b4b4(
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4,
Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_util_definitionTb4b4b4,
Te6edf3DeviceTb4b4b4.Te6edf3AIR_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3displayInfoDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3DeviceMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3fillMaxHeightTb4b4b4(Te6edf3fraction Tff7b72= T79c0ff0.33fTb4b4b4)Tb4b4b4,
Te6edf3telemetries Tff7b72= Te6edf3telemetriesTb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3legendData Tff7b72= Te6edf3LEGEND_DATATb4b4b4,
Te6edf3vicoScrollState Tff7b72= Te6edf3rememberVicoScrollStateTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedX Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3onPointSelected Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
T8b949e/* Device Metric Cards */
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3itemsIndexedTb4b4b4(Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3telemetry Tff7b72-Tff7b72>
Te6edf3DeviceMetricsCardTb4b4b4(Te6edf3telemetry Tff7b72= Te6edf3telemetryTb4b4b4, Te6edf3isSelected Tff7b72= Tff7b72falseTb4b4b4, Te6edf3onClick Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.16s